package cn.wzx.service;

import cn.wzx.entity.OrdInfo;
import cn.wzx.entity.OrdItem;
import cn.wzx.entity.Order;
import cn.wzx.entity.OrderLine;
import cn.wzx.mapper.BookMapper;
import cn.wzx.mapper.CartMapper;
import cn.wzx.mapper.OrderMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class OrderServiceImpl implements OrderService {
    @Autowired(required = false)
    OrderMapper orderMapper;
    @Autowired(required = false)
    CartMapper cartMapper;
    @Autowired(required = false)
    BookMapper bookMapper;

    // 根据订单ID找到订单明细及对应的书本信息
    @Override
    public List<Map<String, Object>> findItemInfoByOrdid(Integer ordid) {
        return orderMapper.findItemInfoByOrdid(ordid);
    }

    @Override
    // 添加订单及订单明细
    //购物车转订单，这里需要开启事务处理，如果获取不到订单的ID，则不能进行添加，进行抛异常，进行事务回滚
    @Transactional
    //订单头和订单明细是一对多的关系，订单明细能有多条，所以这里传的是数组对象
    public void addCart2Order(Order order, List<OrdItem> items) {
        // 先声明一个总价格
        Double amount = 0.0;
        // 遍历订单明细的数组对象，订单的总价钱等于订单明细的数量*对应的价格
        for (OrdItem item : items) amount += item.getNum() * item.getPrice();
        //给订单的总价格赋值
        order.setAmount(amount);
        order.setTcreate(new Date());
        order.setIspay(0);
        // 添加到订单头
        orderMapper.addOrd(order);
        //获取到订单头的ID
        int ordid = order.getOrdid();
        System.out.println("ordid===============" + ordid);
        // 如果获取不到订单的ID，则进行抛异常，进行事务回滚
        if (ordid < 1) throw new RuntimeException("获取不到订单ID，添加订单失败,进行事务回滚");
        // 遍历每条订单明细
        for (OrdItem item : items) {
            item.setOrdid(ordid);
            System.out.println("item=============" + item);
            // 添加每一条订单明细
            orderMapper.addItem(item);
            //加入了订单代表已经销售出去了，该商品的销量应当 + 销售了的数量，以便主页销量前 5 重新排序
            bookMapper.addSale(item.getBookid(), item.getNum());
        }
    }

    // 添加收货地址和电话
    @Override
    public void addAddr(Order order) {
        orderMapper.addAddr(order);
    }

    // 修改付款状态
    @Override
    public void addPay(Order order) {
        order.setTpay(new Date());
        orderMapper.addPay((order));
    }

    // 根据订单ID查询该订单
    @Override
    public Order findOrderById(Integer id) {
        return orderMapper.findOrderById(id);
    }

    // 根据用户 ID 和 订单 ID 找到该订单的订单明细以及订单明细里的书本信息，订单和订单明细是一对多的关系，订单明细和书本信息是一对一的关系
    @Override
    public OrdInfo findInfoByOrdid(Integer uid, Integer ordid) {
        Map<String, Object> map = new HashMap<>();
        map.put("uid", uid);
        map.put("ordid", ordid);
        OrdInfo ordInfo = orderMapper.findInfoByOrdid(map);
        return ordInfo;
    }

    //动态条件查询，模糊查询，有值传入就查询，没有值就跳过，查询到用户所有订单头信息包括用户信息
    @Override
    public List<OrderLine> findOrdLines(Map map) {
        return orderMapper.findOrdLines(map);
    }

    // 计算总页数
    @Override
    public int count(Map map) {
        System.out.println("map=============" + map);
        return orderMapper.count(map);
    }

    // 添加发货单号
    @Override
    public void addShip(Order order) {
        orderMapper.addShip(order);
    }


}
